/**
* @Title: HqlTest.java
* @Package com.hibernates
* @Description: TODO(用一句话描述该文件做什么)
* @author antch,861710865@qq.com
* @date 2017年6月30日 下午2:05:03
* @version V1.0
*/

package com.hibernates;

import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.query.Query;

import com.model.Book;

/**
 * @ClassName: HqlTest
 * @Description: TODO(Hql查询)
 * @author antch,861710865@qq.com
 * @date 2017年6月30日 下午2:05:03
 *
 */

public class HqlTest {

	/**
	 * @Title: main
	 * @Description: TODO(这里用一句话描述这个方法的作用) @param @param args 设定文件 @return void
	 *               返回类型 @throws
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//
		StandardServiceRegistry standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();

		SessionFactory sessionFactory = new MetadataSources(standardServiceRegistry).buildMetadata()
				.buildSessionFactory();

		Session session = sessionFactory.openSession();

		System.out.println("查询结果:" + new HqlTest().getBookByName(session, "java开发"));

		System.out.println("分页查询-----------------》》》");
		pageQuery(session);

		System.out.println("部分属性查询——————————————————————》》》》");
		attrQuery(session);

		setXXQuery(session);


		System.out.println("hql命名查询————————————————————》》》》");
		getQueryFromHbm(session);
	}

	/**
	 *
	 * @Title: getBookByName @Description: TODO(参数绑定查询) @param @param
	 * session @param @param bookName @param @return 设定文件 @return Book 返回类型 @throws
	 */
	public Book getBookByName(Session session, String bookName) {

		String hql = "from Book b where b.bookName = :bookName";
		@SuppressWarnings("unchecked")
		Query<Book> query = session.createQuery(hql);
		// query.setString("", bookName);已经过时
		query.setParameter("bookName", bookName);
		// query.
		List<Book> books = query.getResultList();

		System.out.println("查询到的总的数量：：" + books.size());
		if (books.size() == 0) {
			return null;
		}
		return books.get(0);

	}

	/**
	 *
	 * @Title: pageQuery @Description: TODO(分页查询) @param @param session 设定文件 @return
	 * void 返回类型 @throws
	 */
	public static void pageQuery(Session session) {
		String hql = "from Book";
		@SuppressWarnings("unchecked")
		Query<Book> query = session.createQuery(hql);
		query.setFirstResult(2).setMaxResults(2);
		System.out.println(query.list());
	}

	/**
	 *
	 * @Title: attrQuery
	 * @Description: TODO(属性查询)
	 * @param @param
	 *            session 设定文件
	 * @return void 返回类型
	 * @throws
	 *
	 *
	 * 			属性查询只查找持久化类的部分属性而不是全部属性,通过属性查询有两种方式:
	 *
	 *             (1).通过直接指定属性进行属性查询，例如: (2)通过构造方法进行属性查询,使用这种方法需要持久化类中添加相应的构造方法
	 */
	public static void attrQuery(Session session) {
		String hql = "select bookName,bookPrice from Book";
		@SuppressWarnings("unchecked")
		Query<Object[]> query = session.createQuery(hql);
		List<Object[]> list = query.list();
		for (Object[] objects : list) {
			System.out.println("部分属性查询：：：" + "书名：：" + objects[0] + ",价格：：" + objects[1]);
		}
	}

	/*
	 * 参数绑定查询例子
	 */

	/**
	 *
	 * @Title: setXXQuery @Description: TODO(使用"?"占位符。) @param 设定文件 @return void
	 * 返回类型 @throws
	 */
	@SuppressWarnings("unchecked")
	public static void setXXQuery(Session session) {
		String hql = "from Book where bookName like ?";
		Query<Book> query = session.createQuery(hql);
		// canshu参数绑定
		/*
		 * query.setString(0, "%" + "web" + "%"); 已过时。
		 * （从5.2开始）使用setParameter（int，Object）或setParameter（int，Object，Type） 绑定位置字符串值参数。
		 */
		query.setParameter(0, "%" + "web" + "%");
		List<Book> list = query.list();

		System.out.println("使用\"?\"占位符查询-------------->");
		System.out.println(list);

	}

	/*
	 * QBC查询
	 * Criteria查询概述 Criteria查询(Query By Criteria,
	 * QBC)是与HQL完全不同的一种查询机制。Criteria查询又称对象查询，
	 * 它采用对象的方式，封装查询条件，并提供了Restriction等类型做辅助，
	 * 可以使编写查询代码更加方便。
	 */

	/**
	 *
	* @Title: getBookByCriteria
	* @Description: TODO(使用criteria查询,未能成功实现这个查询)
	* @param @param session    设定文件
	* @return void    返回类型
	* @throws
	 */
	public static void getBookByCriteria(SessionFactory factory) {
		/*Criteria criteria = session.createCriteria(Book.class);
		SharedSessionContract sessionContract = session;
		sessionContract.createCriteria(Book.class);

//		EntityManager em = JPA
*/
		@SuppressWarnings("unused")
		EntityManager entityManager = factory.createEntityManager();
//		Criteria criteria = entityManager.
	}





	/**
	 *
	* @Title: getQueryFromHbm
	* @Description: TODO(HQL命名查询)
	* @param @param session    设定文件
	* @return void    返回类型
	* @throws
	 */
	public static void getQueryFromHbm(Session session) {

		@SuppressWarnings("unchecked")
		Query<Book> query = session.getNamedQuery("getBookByName");
		query.setParameter(0, "%" + "j" + "%");
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println("-----------------------------------");
			System.out.println(book);
		}

	}

}
